package polypeptide;

public class DynamicBinding {
    public static void main(String[] args) {
        //a 的编译类型 A, 运行类型 B
        A a = new B();//向上转型
        System.out.println(a.sum());//?40（子类sum在） -> 30（子类sum不在）
        System.out.println(a.sum1());//?30（子类sum1在）-> 20(子类sum1不在）
        System.out.println(a.i);//属性没有动态绑定机制，输出遍历类型A类的i为10
        System.out.println(a.getI());//20，方法存在动态绑定机制，所以调用的是B类的getI()
    }
}

class A {//父类
    public int i = 10;
    //动态绑定机制:
    /*
    当子类B的sum方法不存在，我们会调用父类的方法sum
    当子类B的sum方法存在，我们会调用子类的方法sum，这个时候输出的值就和父类无关了
     */

    public int sum() {//父类sum()
        /*
           【当b类getI()存在，且运行类型为B的时候，这里调用B类的getI()，拿到20】加上这个属于本类的i，即，20+10=30
           【当b类getI()不存在，且运行类型为B的时候，这里调用A类的getI()，拿到10】加上这个属于本类的i，即，10+10=20】
         */
        return getI() + i;//20 + 10
    }

    public int sum1() {//父类sum1()
        return i + 10;//10 + 10
    }

    public int getI() {//父类getI
        return i;
    }
}

class B extends A {//子类
    public int i = 20;
    /*
    sum存在的时候，运行时方法是B，i是本类的属性，得到结果为20+20为40
    sum不存在的时候，运行时方法还是B，会往父类找sum方法，如果遇到父类和子类同时存在的方法，以运行时类型为准作为调用
     */
    public int sum() {
        return i + 20;
    }

    public int getI() {//子类getI()
        return i;
    }

//    public int sum1() {
//        return i + 10;
//    }
}
